package com.aier.src.service.impl;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.aier.admin.entity.SysBase;
import com.aier.admin.entity.mapper.SysBaseRowMapper;
import com.aier.common.common.LogBase;
import com.aier.common.common.SystemConfig;
import com.aier.common.dao.ICommonDAO;
import com.aier.src.service.ISysDataService;


@Component("sysDataService")
public class SysDataServiceImpl_J implements ISysDataService {

    /**
     * 系统启动次数
     */
    private static final String sys_start_size = "sys_start_size";

    /**
     * 数据库版本
     */
    private static final String sys_database_version = "sys_database_version";

    /**
     * 可支持的服务器版本
     */
    private static final String sys_web_version = "sys_web_version";

    /**
     * web0.1版本
     */
    private static final double WEB_VERSION_0_1 = 0.1;

    /**
     * web0.2版本
     */
    private static final double WEB_VERSION_0_2 = 0.2;
    

    /**
     * 当前服务器版本
     */
    public static double web_version = WEB_VERSION_0_1;

    @Resource(name = "commonDao")
    private ICommonDAO commonDao;

    public void setCommonDao(ICommonDAO commonDao) {
        this.commonDao = commonDao;
    }

    @Override
    public void initSysData() {

    }

    @Override
    public void loadSysData(Map<Integer, String> sysdata) {

    }

    @Override
    public void updateSysStart() {
        List<SysBase> list = searchAllSysBase();
        for (SysBase sb : list) {
            if (sys_start_size.equals(sb.getName())) {
                // 系统启动次数
                try {
                    SystemConfig.sys_start_size = Integer.parseInt(sb
                            .getValue()) + 1;
                } catch (Exception e) {
                    LogBase.error("系统启动次数加载失败", e);
                }
            } else if (sys_database_version.equals(sb.getName())) {
                // 数据库版本
                try {
                    SystemConfig.sys_database_version = Double.parseDouble(sb
                            .getValue());
                } catch (Exception e) {
                    LogBase.error("数据库版本加载失败", e);
                }
            } else if (sys_web_version.equals(sb.getName())) {
                // 可支持的服务器版本
                try {
                    SystemConfig.sys_web_version = Double.parseDouble(sb
                            .getValue());
                } catch (Exception e) {
                    LogBase.error("可支持的服务器版本加载失败", e);
                }
            }
        }
        // 启动数据库升级器
        updateSysDatabaseUp();
        commonDao.update("SET GLOBAL event_scheduler = ON;",new Object[] { });
        commonDao.update("update sys_base set value=? where name=?",
                new Object[] { SystemConfig.sys_start_size, sys_start_size });
    }

    /**
     * 数据库升级器
     */
    private void updateSysDatabaseUp() {
        if (!comparisonVersion()) {
            LogBase.error("服务器无法识别数据库版本:" + SystemConfig.sys_database_version);
            return;
        }

        int error_size = 0;
        double wversion = web_version;

        while (SystemConfig.sys_database_version != web_version) {
            if (WEB_VERSION_0_1 == SystemConfig.sys_database_version) {
                // 0.1数据库版本升级到0.2
                LogBase.info("正在升级数据库版本:" + WEB_VERSION_0_1 + ">"
                        + WEB_VERSION_0_2);
                error_size = dealDatabaseUp0_2();
                if (error_size != 1) {
                    wversion = WEB_VERSION_0_1;
                    LogBase.error("数据库在0.1升级到0.2版本时发生异常,异常代码:" + error_size);
                    break;
                }
                LogBase.info("升级成功!");
            }
            
        }

        commonDao.update("update sys_base set value=? where name=?",
                new Object[] { wversion, sys_database_version });
    }

    /**
     * 版本比对器
     * @return
     */
    private boolean comparisonVersion() {
        double[] versions=new double[] { WEB_VERSION_0_1 };//WEB_VERSION_0_2
        for(double ver:versions){
            if(SystemConfig.sys_database_version==ver){
                return true;
            }
        }
        return false;
    }


    
    /**
     * 0.1>0.2数据库升级
     * 
     * @return
     */
    private int dealDatabaseUp0_2() {
        SystemConfig.sys_database_version = WEB_VERSION_0_2;
        // 升级可支持版本到0.2
        commonDao.update("update sys_base set value=? where name=?",
                new Object[] { WEB_VERSION_0_2, sys_web_version });
        LogBase.info("数据库已成功升级到" + WEB_VERSION_0_2 + "版本");
        return 1;
    }

    /**
     * 查询出所有的系统配置项
     */
    @SuppressWarnings("unchecked")
    private List<SysBase> searchAllSysBase() {
        return (List<SysBase>) commonDao.list(
                "select * from sys_base where state=?",
                new Object[] { STATE_ON }, new SysBaseRowMapper());
    }

}
